<?php

namespace App\Models;


/**
*可分表的trait类
*/
trait ModelTableDividable
{

    /**
     * @var string $table_part_identification 分表标识
     */
    private static $table_part_identification;


    /**
     * 设置分表标识
     * @param string $identification
     */
    public static function setTableIdentification($identification)
    {
        self::$table_part_identification = $identification;
    }

    /**
     * 获取分表标识
     * @return string
     */
    public static function getTableIdentification()
    {
        return self::$table_part_identification;
    }


    /**
     * 固定分表数量
     */
    protected static function tablePartNum()
    {
        return self::PART_NUM ?? 1;
    }

    /**
     * 动态获取表名
     * @return string
     */
    public function getTable()
    {
        return $this->getTableName();
    }

    /**
     * 分用户id分表
     */
    public function getTableName()
    {
        $table_part_identification = $this->getTableIdentification();
        if (empty($table_part_identification)) {
            return $this->table;
        //    throw (new \Exception('分表标识不存在'));
        }
        return $this->table . '_' . $this->calculateSuffix($table_part_identification);
    }

    /**
     * 计算表名后缀 使用默认方法 可以在基础类重写这个方法
     */
    protected function calculateSuffix($value)
    {
        return $value;
    }


    /**
     * 计算表名后缀
     * @param string $value 参考值
     * @param int $number 分表数
     * @return int
     */
    protected function modSuffix($value, $number)
    {
        return $value % $number;
    }


    /**
     * 计算表名后缀
     * @param string $value 参考值
     * @param int $number 分表数
     * @return int
     */
    protected function crcSuffix($value, $number)
    {
        return abs(sprintf('%u', crc32($value))) % $number;
    }
}
